// 引用
import axios from 'axios'
import router from '../router'
import { ElMessage } from 'element-plus'
import config from '../config/config.js'  //环境地址
import store from '../store'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'

axios.defaults.baseURL = config.server  // 服务器地址

// 创建axios实例
const request = axios.create({
    // baseURL: config.server, // 本地环境地址
    timeout: 3000, // 请求超时时间，3000ms未响应则停止请求
    // withCredentials: true, // 允许携带cookie
    responseType: 'json',
    headers: {'Content-Type': 'application/json; charset=utf-8'}
  });

// 请求白名单
const whiteUrlSuffixArr = ['login', 'captcha']

// axios请求拦截器
request.interceptors.request.use((config) => {
  // 发送请求之前做一些处理
  NProgress.start() // 进度条开始
  // 为白名单之外的请求附带上token
  const whiteUrl = whiteUrlSuffixArr.find((item)=>config.url?.endsWith(item))
  if(!whiteUrl){
    // 获取token
    const token = store.getters.getToken
    config.headers.authorization = token
  }
  return config;
}, (error) => {
  // 当请求异常时做一些处理
  // 弹出错误消息
  ElMessage.error(error.message)
  return Promise.reject(error);
});

// axios 响应拦截器
request.interceptors.response.use((response) => {
  NProgress.done()  // 进度条结束
  // 返回响应时做一些处理
  const res = response.data
  // console.log(response)
  // 判断返回状态
  if (res.code === 200) {
    //逻辑处理
    return res;
  }
  else {
    ElMessage.error(res?.msg || '系统异常')
    return Promise.reject(res.msg)
  }
}, (error) => {
  // 当响应异常时做一些处理
  // 如果是服务器返回的错误
  if(error.response?.data) {
    error.message = error.response.data.msg
  }
  // 如果是未登录
  if(error.response?.status == 401) {
    router.push({ path:'/login' })
  }
  // 弹窗提示
  ElMessage.error(error.message)
  return Promise.reject(error);
});

export default request